Apache POI লাইব্রেরি ব্যবহার করে Microsoft Office ফাইল (বিশেষ করে Excel এবং Word ফাইল) পরিচালনা করতে হলে Memory Management এবং Large File Handling খুব গুরুত্বপূর্ণ বিষয়। যেহেতু POI একটি Java লাইব্রেরি, তাই বড় বড় ফাইলগুলো মেমোরিতে লোড করলে OutOfMemoryError হতে পারে। এই সমস্যা এড়াতে এবং পারফরম্যান্স বৃদ্ধি করতে, কিছু নির্দিষ্ট কৌশল ব্যবহার করা যেতে পারে।
এখানে আমরা দেখব কীভাবে বড় বড় ফাইলকে Memory Efficiently প্রসেস করা যায় এবং Large Files এর ক্ষেত্রে পারফরম্যান্স অপটিমাইজেশন করা যায়।
১. Memory Management: SAX Parsing এবং Streaming API ব্যবহার
Apache POI এর মধ্যে SAX Parsing এবং Streaming API এর মাধ্যমে আপনি Excel ফাইলকে মেমোরি-efficientভাবে পড়তে পারেন। SAX Parsing এমন একটি পদ্ধতি যা একে একে ফাইলের ডেটা প্রক্রিয়া করে, পুরো ফাইলকে একসাথে মেমোরিতে লোড করে না।
Excel ফাইলের জন্য SAX Parsing ব্যবহার করা
SXSSF এবং XSSF API এর মধ্যে SXSSF সবচেয়ে উপকারী যখন বড় Excel ফাইল (যেমন ১০০,০০০ বা তারও বেশি রেকর্ড) লিখতে হয়, কারণ এটি মেমোরি ইফিশিয়েন্ট এবং লেখার সময় ফাইলটিকে স্ট্রিম করে।
SXSSF একটি streaming API যা শুধুমাত্র কিছু পঙক্তি মেমোরিতে রাখে এবং বাকি ডেটা ডিস্কে লেখে।
উদাহরণ: Large Excel ফাইল লেখা SXSSF ব্যবহার করে
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class LargeExcelFileHandling {
public static void main(String[] args) throws IOException {
// SXSSFWorkbook ব্যবহার করে একটি মেমোরি-efficient এক্সেল ফাইল তৈরি করা
SXSSFWorkbook workbook = new SXSSFWorkbook(); // Creating SXSSFWorkbook
Sheet sheet = workbook.createSheet("LargeSheet");
// বড় ডেটার জন্য রেকর্ড তৈরি করা
for (int i = 0; i < 100000; i++) {
Row row = sheet.createRow(i);
for (int j = 0; j < 10; j++) {
row.createCell(j).setCellValue("Row " + i + " Col " + j);
}
}
// ফাইল সেভ করা
try (FileOutputStream out = new FileOutputStream("LargeExcelFile.xlsx")) {
workbook.write(out);
}
// মেমোরি ক্লিয়ার করা
workbook.dispose(); // Clear memory
}
}
এখানে SXSSFWorkbook ব্যবহার করা হয়েছে, যা ডেটা লেখার জন্য অল্প কিছু রেকর্ড মেমোরিতে রাখে এবং বাকি ডেটা ডিস্কে লেখে। শেষের দিকে workbook.dispose() পদ্ধতি ব্যবহার করে মেমোরি মুক্ত করা হয়েছে।
২. Word ডকুমেন্টের জন্য Memory Management
Apache POI এর XWPFDocument ব্যবহার করে Word ডকুমেন্টে কাজ করার সময় বড় ডকুমেন্টের জন্য মেমোরি ব্যবস্থাপনা খুবই গুরুত্বপূর্ণ। POI লাইব্রেরি পুরো ডকুমেন্ট একসাথে মেমোরিতে লোড করার পরিবর্তে বিভিন্ন পদ্ধতির মাধ্যমে streaming অপারেশন করতে সাহায্য করে।
উদাহরণ: একটি Word ডকুমেন্টে টেক্সট স্ট্রিমিং করা
import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;
import java.io.IOException;
public class LargeWordFileHandling {
public static void main(String[] args) throws IOException {
// XWPFDocument ব্যবহার করে একটি নতুন Word ডকুমেন্ট তৈরি করা
XWPFDocument document = new XWPFDocument();
// বড় ডকুমেন্টের জন্য প্যারাগ্রাফ এবং টেক্সট যোগ করা
for (int i = 0; i < 10000; i++) {
XWPFParagraph paragraph = document.createParagraph();
XWPFRun run = paragraph.createRun();
run.setText("This is line number " + i);
}
// ফাইল সেভ করা
try (FileOutputStream out = new FileOutputStream("LargeWordFile.docx")) {
document.write(out);
}
document.close();
}
}
এই ক্ষেত্রে, XWPFDocument ব্যবহার করে বড় Word ডকুমেন্ট তৈরি করা হচ্ছে, এবং প্রতি প্যারাগ্রাফে একটি রান যুক্ত করা হচ্ছে। কিন্তু এখানে পুরো ডকুমেন্ট মেমোরিতে একসাথে লোড না করে সেগুলি একসাথে লেখা হচ্ছে, যার ফলে মেমোরির ব্যবহার কম হয়।
৩. POI-র সঙ্গে Large Files এ ডেটা Read করা
POI লাইব্রেরি দ্বারা Large Excel বা Word ফাইল থেকে ডেটা পড়তে হলে, Streaming API (যেমন SAX) ব্যবহার করাটা গুরুত্বপূর্ণ। এখানে XSSF বা SXSSF ব্যবহার করে একসাথে একটি বড় ফাইল মেমোরিতে লোড না করে টুকরো টুকরো করে ডেটা প্রক্রিয়া করা হয়।
উদাহরণ: Excel ফাইল থেকে SAX Parsing দিয়ে ডেটা পড়া
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.eventusermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
public class LargeExcelFileRead {
public static void main(String[] args) throws IOException, InvalidFormatException {
// Excel ফাইলের জন্য InputStream তৈরি করা
FileInputStream inputStream = new FileInputStream("LargeExcelFile.xlsx");
// SAX XML Event-Based Parsing ব্যবহারের জন্য XMLReader ব্যবহার করা
XSSFRSSheetXMLHandler handler = new XSSFRSSheetXMLHandler(inputStream);
// ডেটা প্রক্রিয়া
handler.process();
inputStream.close();
}
}
এখানে SAX Parsing ব্যবহার করে Excel ফাইল থেকে ডেটা পড়ার জন্য XSSF ব্যবহার করা হয়েছে। SAX Parser স্ট্রিমিং পদ্ধতিতে ফাইলটি পড়বে এবং একসাথে পুরো ফাইল মেমোরিতে লোড হবে না।
৪. File Compression এবং Optimization Techniques
বড় ফাইলগুলির পারফরম্যান্স অপটিমাইজ করার জন্য আপনি ফাইলটি কম্প্রেসও করতে পারেন। POI এর মাধ্যমে Excel ফাইলের ডেটা কম্প্রেস করা যায় এবং কম্প্রেসড ফাইল সেভ করা যায়।
উদাহরণ: Excel ফাইল কম্প্রেস করা
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
public class ExcelCompression {
public static void main(String[] args) throws IOException {
// Excel Workbook তৈরি করা
XSSFWorkbook workbook = new XSSFWorkbook();
// ডেটা তৈরি করা এবং ফাইল সেভ করা
try (FileOutputStream out = new FileOutputStream("CompressedFile.xlsx")) {
workbook.write(out);
}
// File কম্প্রেস করা
compressFile("CompressedFile.xlsx");
}
public static void compressFile(String filePath) throws IOException {
FileInputStream fis = new FileInputStream(filePath);
FileOutputStream fos = new FileOutputStream(filePath + ".gz");
GZIPOutputStream gzipOS = new GZIPOutputStream(fos);
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
gzipOS.write(buffer, 0, len);
}
gzipOS.finish();
fis.close();
fos.close();
}
}
এখানে GZIP ব্যবহার করে Excel ফাইলটি কম্প্রেস করা হয়েছে।
সারাংশ
- Apache POI দিয়ে Large Excel এবং Word ফাইল পরিচালনা করতে হলে মেমোরি ইফিশিয়েন্ট পদ্ধতি ব্যবহার করা উচিত।
- SXSSF এবং XSSF এর মাধ্যমে streaming পদ্ধতি ব্যবহার করে বড় ডেটা ফাইল লিখতে এবং পড়তে সুবিধা হয়।
- SAX Parsing এবং Streaming API ব্যবহারের মাধ্যমে Excel ফাইলের ডেটা প্রক্রিয়া করতে মেমোরি ব্যবস্থাপনা করা যায়।
- File Compression পদ্ধতি ব্যবহার করে ফাইলের আকার কমানো এবং পারফরম্যান্স বৃদ্ধি করা সম্ভব।